package org.thread.test06.ts.homework.demo02;

import java.util.LinkedList;

/**
 * 篮子 - 装水果
 *
 * @author lwj
 * @date 2025-03-14
 * @vesion 1.0.0
 */
public class Box {
    /**
     * 篮子容器
     */
    private LinkedList<Fruit> boxList = new LinkedList<>();
    /**
     * 篮子最大容量
     */
    private static final int MAX_SIZE = 5;

    /**
     * 摘水果
     * @param name 男孩姓名
     * @param fruit 水果名称
     */
    public synchronized void put(String name, Fruit fruit){
        // 篮子满了
        if(boxList.size() == MAX_SIZE){
            // 唤醒女孩吃水果
            this.notify();

            try {
                // 男孩停止摘水果 - 进入等待状态
                this.wait();
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }

            return;
        }

        // 未满放水果
        System.out.printf("当前篮子的容量：[%s],%s把%s放进篮子里 %n",boxList.size()+1,name,fruit);
        // 摘进篮子里
        boxList.add(fruit);

        try {
            Thread.sleep(500);
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
    }

    /**
     * 取水果
     * @param name 女孩姓名
     */
    public synchronized void take(String name){
        // 篮子里面没水果
        if(boxList.isEmpty()){
            System.out.println("篮子里面没有水果了");

            // 唤醒男孩摘水果
            this.notify();

            try {
                // 女孩停止吃水果 - 进入等待状态
                this.wait();
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }

            return;
        }
        Fruit delFruit = boxList.removeLast();
        // 吃最后一个水果
        System.out.printf("当前篮子的容量：[%s],%s正在吃%s %n",boxList.size()+1,name,delFruit);

        try {
            Thread.sleep(500);
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
    }
}
